/**
 * *********************** ******* ***********************************
 *
 *  
 * 
 *  
 * *******************************************************************
 */

package com.arges.web.domain.tableutil;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;

/**
 * 通过反射 处理一些属性或方法
 *
 * 
 * @version Ver 3.0
 * @since Ver 3.0
 * @Date 2012-9-6
 *
 */
public class EnhancedReflectionUtils
{

	/**
	 * 
	 * 设置对象内属性的值
	 *
	 * @param targetObject 类对象
	 * @param name 属性名
	 * @param value 属性值
	 * @since Ver 3.0
	 */
	public static void setFieldValue(Object targetObject, String name, Object value)
	{
		Field field = ReflectionUtils.findField(targetObject.getClass(), name);
		setFieldValue(targetObject, field, value);
	}

	/**
	 * 
	 * 设置对象内属性的值
	 *
	 * @param targetObject 对象
	 * @param field 经反射后生成的属性
	 * @param value 属性值
	 * @since Ver 3.0
	 */
	public static void setFieldValue(Object targetObject, Field field, Object value)
	{
		ReflectionUtils.makeAccessible(field);
		ReflectionUtils.setField(field, targetObject, value);
	}

	/**
	 * 
	 * 获取对象内属性的值
	 *
	 * @param targetObject 对象
	 * @param field 经反射后生成的属性
	 * @since Ver 3.0
	 */
	public static Object getFieldValue(Object targetObject, Field field)
	{
		ReflectionUtils.makeAccessible(field);
		return ReflectionUtils.getField(field, targetObject);
	}

	/**
	 * 
	 * 获取对象内属性的值
	 *
	 * @param targetObject 对象
	 * @param name 属性名
	 * @since Ver 3.0
	 */
	public static Object getFieldValue(Object targetObject, String fieldName)
	{
		return getFieldValue(targetObject, getField(targetObject.getClass(), fieldName));
	}

	public static Field getField(Object targetObject, String fieldName)
	{
		return getField(targetObject.getClass(), fieldName);
	}

	/**
	 * 
	 * 根据 属性名 生成 getMethod返回的值，如果 找不到 get方法，则去找 is方法， 如 on属性，如果找不到 getOn方法，会去找 isOn方法
	 *
	 * @param targetObject
	 * @param fieldName
	 * @return
	 * @since Ver 3.0
	 */
	public static Object getMethodValueForField(Object targetObject, String fieldName)
	{
		Method method = getMethodForField(targetObject.getClass(), fieldName);
		return ReflectionUtils.invokeMethod(method, targetObject);
	}

	/**
	 * 
	 * 根据 属性名 生成 getMethod，如果 找不到 get方法，则去找 is方法， 如 on属性，如果找不到 getOn方法，会去找 isOn方法
	 *
	 * @param targetObject
	 * @param fieldName
	 * @return
	 * @since Ver 3.0
	 */
	public static Method getMethodForField(Class<?> clazz, String fieldName)
	{
		String capitalizedFieldName = StringUtils.capitalize(fieldName);
		Method method = ReflectionUtils.findMethod(clazz, "get" + capitalizedFieldName);
		if (method == null)
		{
			method = ReflectionUtils.findMethod(clazz, "is" + capitalizedFieldName);
		}

		if (method == null)
		{
		}
		return method;
	}

	/**
	 * 
	 * 根据 属性名 生成 setMethod，如果 找不到 set方法，则去找 is方法，
	 *
	 * @param targetObject
	 * @param fieldName
	 * @return
	 * @since Ver 3.0
	 */
	@SuppressWarnings("unchecked")
	public static Method setMethodForField(Class<?> clazz, String fieldName)
	{
		Method method = null;
		try
		{
			String capitalizedFieldName = StringUtils.capitalize(fieldName);
			Class[] parameterTypes = new Class[1];
			Field field = clazz.getDeclaredField(fieldName);
			parameterTypes[0] = field.getType();
			method = ReflectionUtils.findMethod(clazz, "set" + capitalizedFieldName, parameterTypes);
			if (method == null)
			{
				method = ReflectionUtils.findMethod(clazz, "is" + capitalizedFieldName);
			}

			if (method == null)
			{
			}
		}
		catch (Exception e)
		{

		}
		return method;

	}

	/**
	 * 
	 * 通过反射生成field
	 *
	 * @param clazz 类
	 * @param name 属性名
	 * @return
	 * @since Ver 3.0
	 */
	public static Field getField(Class<?> clazz, String name)
	{
		return ReflectionUtils.findField(clazz, name);
	}
}
